home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 November
/
EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso
/
earcd
/
ead
/
ead16.dms
/
ead16.adf
/
Listati
/
Memtool.a
< prev
next >
Wrap
Text File
|
1989-06-13
|
9KB
|
263 lines
*******************************************************************
* Programma.......... Memtool.a
* Autore............. Henrik Clausen
* Versione .......... 1.1I - Giugno 1989
* Linguaggio ........ Assembler 68000
* Scopo ............. Visualizza memoria libera in finestra
* Hardware .......... Amiga 512K, Kickstart V1.2/1.3
* Software .......... Hisoft DevPac V2.13 od altro assemblatore
* Note .............. Traduzione ed adattamento di L. R. Callegari
* ................... Eliminato bug deallocazione memoria difettosa
*******************************************************************
* La prima linea è esclusiva di DevPac e consente di indicare la
* directory di ricerca dei files di inclusione, secondo i nomi di
* volume e directory del nostro ambiente assembler.
INCDIR "Work:Assem/Include/"
* Includiamo i files necessari, compresi quelli con gli offset di
* chiamata in libreria (xxxx_lib.i) che consentono di generare un
* file eseguibile senza dovere passare dal linker.
INCLUDE "intuition/intuition.i"
INCLUDE "graphics/text.i"
INCLUDE "graphics/rastport.i"
INCLUDE "libraries/dos.i"
INCLUDE "exec/exec_lib.i"
INCLUDE "intuition/intuition_lib.i"
INCLUDE "graphics/graphics_lib.i"
INCLUDE "libraries/dos_lib.i"
INCLUDE "misc/easystart.i"
AbsExecBase EQU $4 ; Indirizzo di ExecBase
lea DosName,a1 ; A1 = nome libreria DOS
clr.l d0 ; Qualunque versione
movea.l AbsExecBase,a6 ; A6 = ExecBase
jsr _LVOOpenLibrary(a6) ; Apre libreria
move.l d0,DosBase ; Memorizza puntatore
tst.l d0 ; Ma esce in caso di errore
bne L1
rts
L1 lea IntuitionName,a1 ; A1 = nome Intuition
clr.l d0 ; D0 = 0 = qualunque versione di libreria
movea.l AbsExecBase,a6 ; A6 = base libreria Exec
jsr _LVOOpenLibrary(a6) ; Apriti Sesamo
move.l d0,IntuiBase ; Ma esce se errore
tst.l d0
beq error
lea GraphicsName,a1 ; Apre libreria grafica
clr.l d0
movea.l AbsExecBase,a6
jsr _LVOOpenLibrary(a6)
move.l d0,GraphicsBase
tst.l d0
beq error
* Le seguenti linee provvedono ad aprire una finestra per l'output
* La funzione è OpenWindow(), con A0 indicante l'indirizzo della
* struttura NewWindow di definizione delle caratteristiche della
* finestra ed A6 il vettore base della libreria Intuition.
movea.l IntuiBase,a6
lea MyNewWindow,a0
jsr _LVOOpenWindow(a6)
tst.l d0
beq error
move.l d0,MyWindow
* Le seguenti linee usano SetWindowTitles() di Intuition per scrivere
* il titolo della finestra, memorizzato in fondo al listato
move.l d0,a0
lea WindowTitle,a1
lea ScreenTitle,a2
movea.l IntuiBase,a6
jsr _LVOSetWindowTitles(a6)
* Qui inizia il nocciolo del programma. So garantisce che vi siano
* gli spazi nella stringa di output e non le vecchie cifre
DisplayMem:
move.l #$20202020,d3 ; Quattro spazi ASCII
move.l d3,ChipCount+6
move.l d3,ChipCount+10
move.l d3,FastCount+6
move.l d3,FastCount+10
* Ora leggiamo tramite funzione AvailMem() di Exec la memoria FAST
* e CHIP libera, stampando i risultati in ASCII
movea.l AbsExecBase,a6
moveq #MEMF_FAST,d1
jsr _LVOAvailMem(a6) ; D0 = bytes di FAST RAM liberi
move.l d0,d4 ; salvati in D4
lea FastCount+15,a0
jsr Convert ; Subroutine universale di conversione
movea.l AbsExecBase,a6
moveq.l #MEMF_CHIP,d1 ; D0 = bytes di CHIP RAM liberi
jsr _LVOAvailMem(a6)
add.l d0,d4 ; salvati in D4
cmpi.l #$C000,d4 ; Se RAM <48K ci suicidiamo
ble Suicide
lea ChipCount+15,a0
jsr Convert
* Ora abbiamo la stringa di testo corretta ed a posto
* Posizioniamo il cursore per la scrittura nella finestra
* Si usa la funzione Move() di Graphics dopo avere messo in A1
* l'indirizzo della RastPort associata alla finestra, ricavato
* dalla struttura Window creata da OpenWindow(), della quale
* è stato restituito il puntatore.
movea.l GraphicsBase,a6
move.l MyWindow,a2
move.l wd_RPort(a2),a1
moveq #17,d1 ; Posizione desiderata
moveq #6,d0
jsr _LVOMove(a6)
* Scriviamo la I stringa tramite Text() di Graphics.library
movea.l GraphicsBase,a6
move.l MyWindow,a2
move.l wd_RPort(a2),a1
lea FastCount,a0
moveq #15,d0 ; Lunghezza stringa
jsr _LVOText(a6)
* Scriviamo la II stringa tramite Text() di Graphics
* Ancora usiamo Move(RP, x=D1, y=D0) per posizionare il cursore
movea.l GraphicsBase,a6
move.l MyWindow,a2
move.l wd_RPort(a2),a1
moveq #27,d1 ; Dove vogliamo scrivere
moveq #6,d0
jsr _LVOMove(a6)
movea.l GraphicsBase,a6
move.l MyWindow,a2
move.l wd_RPort(a2),a1
lea ChipCount,a0
moveq #15,d0 ; Lunghezza stringa
jsr _LVOText(a6)
movea.l DosBase,a6
moveq #100,d1 ; Task a nanna per 2 secondi
jsr _LVODelay(a6)
* Qui si attende che l'utente click sul gadget di chiusura della
* finestra per terminare. Si ricava la porta per messaggi ed
* attendiamo un qualunque mssaggio tramite GetMsg(), in quanto
* l'unico che può pervenire è quello di CLOSEWINDOW.
* Se nullo, ripetiamo ciclo di lettura e visualizzazione memoria.
* Il task usa non molto intensamente la CPU in quanto la chiamata
a Delay() precedente gli fa trascorrere la maggior parte del tempo
* a riposo, se si considera il breve istante di ricalcolo dei valori
* della CHIP e FAST RAM libere.
move.l MyWindow,a0 ; A0 = struttura di finestra
move.l wd_UserPort(a0),a0 ; Ricaviamo indirizzo porta
movea.l AbsExecBase,a6
jsr _LVOGetMsg(a6) ; GetMsg(a0=Porta)
tst.l d0 ; Nulla di clickato
beq DisplayMem ; ricalcoliamo
* Clickato gadget di chiusura. Si chiude la finestra e si termina.
* Usiamo ovviamente CLoseWindow() di Inuition.
exit:
movea.l IntuiBase,a6
movea.l MyWindow,a0
jsr _LVOCloseWindow(a6)
* Le seguenti linee carantiscono un'uscita pulita dal programma
* anche in caso di errore.
error:
movea.l AbsExecBase,a6
move.l IntuiBase,a1
jsr _LVOCloseLibrary(a6) ; Non sarebbe necessario...
clr.l d1 ; Ritorniamo al CLI sempre zero
jsr _LVOExit(a6) ; Richiamiamo Exit() di Exec
clr.l d0 ; Exit() riporta qui. Ora ritorniamo.
rts
* Qui si arriva in caso di necessita di suicidio del task.
* Ciò si verifica in caso di ristrettezza di RAM, ad evitare GURU.
* La procedura non è il massimo dell'eleganza, ma quando si è a corto
* di RAM non si può andare molto per il sottile.
Suicide:
lea 0,a0
movea.l IntuiBase,a6
jsr _LVODisplayBeep(a6)
bra exit ; Now leave
* La seguente routine è facilmente trasportabile, provvedendo
* a convertire un numero in stringa ASCII:
* Input : indirizzo buffer di output in A0, dato in D0
* Output: stringa ASCII numerica all'indirizzo di A0 iniziale
Convert:
move.l d0,d1 ; Dividere per 10 una long può dare overflow
andi.l #$FFFF0000,d1
swap d1
nextdigit:
divu #10,d1
move.w d1,d2 ; La parte più alta del numero
ext.l d2
andi.l #$FFFF0000,d1
andi.l #$0000FFFF,d0
add.l d1,d0
divu #10,d0
swap d0
addi.b #48,d0 ; Il byte basso ora contiene la cifra
move.b d0,-(a0) ; Copia nella stringa in buffer
swap d0 ; Riporta il numero
andi.l #$0000FFFF,d0 ; Maschera cifra
move.l d2,d1 ; Pone la parte alta dove ci serve
add.l d0,d2 ; D2 è perdibile, verifichiamo per la fine
bne nextdigit
rts
* Qui inizia la sezione dei dati. Si potrebbe marcare con una direttiva
* SECTION del compilatore, ma data la brevità del codice soprassediamo.
cnop 0,4
MyWindow: dc.l 0
MyFlags EQU SMART_REFRESH!WINDOWDEPTH!WINDOWDRAG!WINDOWCLOSE
MyNewWindow: dc.w 0,30,132,30
dc.b 1,2 ; Colori
dc.l CLOSEWINDOW ; Flags di IDCMP
dc.l MyFlags
dc.l 0,0
dc.l WindowTitle
dc.l 0 ; Puntatore a schermo custom nullo
dc.l 0 ; Puntatore a bitmap custom nulla
dc.w 0,0,0,0 ; Non ridimensionabile, limiti nulli
dc.w WBENCHSCREEN ; Tipo di schermo
cnop 0,4
WindowTitle: dc.b 'Memory:', 0
ScreenTitle dc.b 'Assembly Language is fun!', 0
IntuitionName: dc.b 'intuition.library', 0
GraphicsName: dc.b 'graphics.library', 0,0
DosName: dc.b 'dos.library', 0
ChipCount: dc.b 'Chip: ', 0
FastCount: dc.b 'Fast: ', 0
cnop 0,4
DosBase: dc.l 0
IntuiBase dc.l 0
GraphicsBase dc.l 0
end
******************************** FINE DEL FILE ************************